package br.com.Orange.dao;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

import br.com.Orange.util.dados.exception.RepositorioVazioException;
import br.com.Orange.util.negocio.ObjetoIdentificado;

public abstract class RepositorioGenericoMap 
					<ID, Dado extends ObjetoIdentificado<ID>,
					DadoInexistenteException extends Exception>{
	
	protected Map<ID, Dado> dados;
	
	public RepositorioGenericoMap(){
		dados = new HashMap<ID, Dado>();
	}
	
	public void inserir (Dado dado) {
		dados.put(dado.getID(), dado);
	}
	
	public void atualizar(Dado dado) throws DadoInexistenteException{
		if (existe(dado.getID())){
			dados.put(dado.getID(), dado);
		}else{
			throw levantaInexistenteException(dado.getID());
		}
	}
	
	public void remover(ID id) throws DadoInexistenteException{
		if (existe(id)){
			dados.remove(id);
		}else{
			throw levantaInexistenteException(id);
		}
	}
	
	public Dado procurar (ID id) throws DadoInexistenteException{
		Dado dado = null;
		if (existe(id)){
			dado = dados.get(id);
		}else{
			throw levantaInexistenteException(id);
		}
		return dado;
	}
	
	public boolean existe(ID id){
		return dados.containsKey(id);
	}
	
	public Collection<Dado> listar() throws RepositorioVazioException{
		if (!dados.isEmpty()){
			Collection<Dado> col = new HashSet<Dado>(); 
			for (Map.Entry<ID, Dado> entry : dados.entrySet()){
				col.add(entry.getValue());
			}
			return col;
		}else{
			throw new RepositorioVazioException();
		}
	}
			
	protected abstract DadoInexistenteException levantaInexistenteException(ID id);
	
}